package com.zhuhai.service;

import com.zhuhai.entity.Passenger;
import com.zhuhai.repository.PassengerReposity;
import com.zhuhai.util.SpecificationUtil;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;

/**
 * 旅客Service.
 *
 *  @author zhuhai
 *  @version 1.0.0.0
 */
@Service
public class PassengerService {

    @Resource
    private PassengerReposity passengerReposity;

    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param name 旅客姓名
     * @param cardNum 证件号
     * @param pageable 分页信息
     * @return 结果
     */
    public Page<Passenger> getPassengerList(final String name, final String cardNum, final Pageable pageable) {
        return  passengerReposity.findByNameContainingAndCardNumOrderByCreateTimeDesc(name, cardNum, pageable);
    }
    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param name 旅客姓名
     * @param pageable 分页信息
     * @return 结果
     */
    public Page<Passenger> getPassengerList(final String name, final Pageable pageable) {
        return passengerReposity.findByNameLikeOrderByCreateTimeDesc(name, pageable);
    }
    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param pageable 分页信息
     * @return 结果
     */
    public Page<Passenger> getPassengerList(final Pageable pageable) {
        return passengerReposity.findAll(pageable);
    }

    /**
     * 使用Specification，查询出pnr出票Office号（issueOfficeCode）为LUM555的儿童（type为CHD）旅客信息。
     * @param issueOfficeCode
     * @param type
     * @return 结果
     */
    public Page<Passenger> findByIssueOfficeCodeAndType(final String issueOfficeCode,
                                                        final String type, final Pageable pageable) {
        final Specification<Passenger> spec = SpecificationUtil.getPassengerSpecification(issueOfficeCode, type);
        return passengerReposity.findAll(spec, pageable);
    }

    /**
     * 使用@Query注解及jpql语句查询出客票低于500的旅客记录，要求使用“countQuery”,返回Page对象，同时使用Sort排序方式根据旅客年龄升序排序。
     * @param price
     * @param pageable 分页
     * @return 结果
     */
    public Page<Passenger> getPassengerListByPriceLessThanEqual(final BigDecimal price, final Pageable pageable) {
        return passengerReposity.getPassengerListByPriceLessThanEqual(price, pageable);
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    public Passenger getPassengerById(final Integer id) {
        return passengerReposity.findById(id).get();
    }

    /**
     * 保存
     * @param passenger
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Passenger save(final Passenger passenger) {
        return passengerReposity.save(passenger);
    }
}
